package learn;

import org.apache.dubbo.common.bytecode.ClassGenerator;
import org.apache.dubbo.common.bytecode.Proxy;
import org.springframework.cglib.core.DebuggingClassWriter;
import sun.misc.ProxyGenerator;

import java.nio.file.Files;
import java.nio.file.OpenOption;
import java.nio.file.Paths;

public class Reflect {
    /**
     * 打印代理class；打印后，idea打开。
     */
    public static void printProxy() throws Exception {
        /* step1，cglib*/
        System.setProperty(DebuggingClassWriter.DEBUG_LOCATION_PROPERTY, "D:\\code");

        /* step2，jdk*/
        ProxyGenerator proxyGenerator;// 检索此类，确定包名。
        // 保存于项目根目录
        //jdk1.8及之前版本使用这个 (我的是1.8,没试过其他版本)
        System.getProperties().put("sun.misc.ProxyGenerator.saveGeneratedFiles","true");
        //新版本jdk使用这个
        System.getProperties().put("jdk.proxy.ProxyGenerator.saveGeneratedFiles", "true");
        Object proxy=null;
        // 直接输出
        byte[] proxyClass = ProxyGenerator.generateProxyClass(proxy.getClass()
                .getSimpleName(), proxy.getClass().getInterfaces());
        String fileName = "D://"+proxy.getClass().getSimpleName()+".class";
        Files.write(Paths.get(fileName), proxyClass , new OpenOption[0]);

        /* step3，dubbo*/
        // Proxy中断点使用，ClassGenerator；getProxy方法
        Proxy dubboProxy;
        ClassGenerator ccp = null, ccm = null;
        // 如果接口是public修饰的 就在debug的时候使用这个能在E盘下生成class文件，e:/com/alibaba/dubbo/common/bytecode/proxy0/proxy0.class
        ccm.getClassPool().get("com.alibaba.dubbo.common.bytecode.proxy0").debugWriteFile("e:\\");
        // 如果接口没有被public修饰 debug的时候可以用以下方式获取class文件
        ccp.getClassPool().get("per.qiao.util.proxy0").debugWriteFile("e:\\");
    }


}
